package cn.jb698.codec.msm.zcodec.demo.msm;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.TemplateType;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.keywords.MySqlKeyWordsHandler;

/**
 * mybatisplus生成器实现
 * 
 * @author LIU(LiuJianbin)
 * @date 2022-04-18
 */
public class MyBatisPlusGeneratImpl {

	public static void main(String[] args) {

		// 模块名称
		String module;

		// 父级包名称如appenv
		String parentPackage;

//       表名称 ,string数组
		String[] tables;

		// 去除表前缀如t_ tb_
		String[] prefix;

		// 数据源配置
		String url = "jdbc:mysql://rm-xx.mysql.rds.aliyuncs.com:3358/tdb_jb_codec_vx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false";
		String dbUserName = "xx";
		String dbPsw = "xx";
		{
			module = "";
			parentPackage = "cn.jb698.codec.demo.bcrud.dbmysql";
			tables = new String[] { "mdt_demo_data_inf", "mdt_demo_data_ext" };
			prefix = new String[] {};
		}

		DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(url, dbUserName, dbPsw).dbQuery(new MySqlQuery())
//                .schema(dbName) // 库名 
		        .typeConvert(new MySqlTypeConvert()).keyWordsHandler(new MySqlKeyWordsHandler()).build();
		// 获取当前项目路径
//        String projectPath = System.getProperty("user.dir");
		String projectPath = "D:/develope/workspace/codec/codec_msm_demo.mbpg";

		// 全局配置
		GlobalConfig globalConfig = new GlobalConfig.Builder()
		        // 输出目录
		        .outputDir(projectPath + "/src/main/java")
//                .fileOverride()  // 覆盖已生成文件
//                .author("Jianbin") // 作者
		        
		        .enableSwagger() // 启用swagger 
//                .dateType(DateType.TIME_PACK)
		        .dateType(DateType.ONLY_DATE) // 时间格式类型, 默认使用DateType.TIME_PACK( java.time包下的 LocalDateTime )
//		        .commentDate("yyyy-MM-dd HH:mm:ss")
		        .build();

		// 包配置
		PackageConfig packegeConfig = new PackageConfig.Builder().parent("" + parentPackage)
		        // 设置父包模块名
		        .moduleName(module)
				// 设置实体包
//                .entity("infrastructure.domain.model")
				// 服务类
//                .service("infrastructure.repository")
				// 服务类实现
//                .serviceImpl("infrastructure.repository.impl")
//                .mapper("infrastructure.mapper")
//                .xml("mapper.xml")
//                .controller("controller")
//                .other("other")
				// 路径信息
//                .pathInfo(Collections.singletonMap(OutputFile.mapperXml, projectPath + "/src/main/resources/mybatis/mapper/"))
		        .build();
		// 模板配置 不配无法生成
		TemplateConfig templateConfig = new TemplateConfig.Builder()
				.disable(TemplateType.ENTITY)
				.entity("/templates/entity.java") // 
				.service("/templates/service.java") // 
		        .serviceImpl("/templates/serviceImpl.java") // 
		        .mapper("/templates/mapper.java") // 
//                .mapperXml("/templates/mapper.xml") // 	
		        .controller("/templates/controller.java") // 
		        .build();
		// 注入配置
		InjectionConfig ic = new InjectionConfig.Builder()
				.beforeOutputFile((tableInfo, objectMap) -> {
			System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size());
		})
		        // 没有自定义配置map对象
		        // 没有模板文件
		        .build();

		// 策略配置
		StrategyConfig strategyConfig = new StrategyConfig.Builder()
		        // 策略 开启大写命名
		        .enableCapitalMode().enableSkipView()

		        .disableSqlFilter() // 禁用SQL过滤

		        .addInclude(tables) // 表名

		        .addTablePrefix(prefix) // 要移除的表前缀

		        .entityBuilder() // 配置实体策略

//                .superClass(Model.class) // 父类  

//                .disableSerialVersionUID() // 禁用序列化,默认 true 

//                .enableChainModel() // 启用链式编程,默认false 

//                .enableLombok() //启用Lombok ,默认false 

		        .enableTableFieldAnnotation() // 启用表字段注解

//                .versionColumnName("version")  // 乐观锁字段 
//                .versionPropertyName("version") //  

				// 逻辑删除
//                .logicDeleteColumnName("del_flag")
//                .logicDeletePropertyName("delFlag")

		        .naming(NamingStrategy.underline_to_camel) // 表名驼峰

		        .columnNaming(NamingStrategy.underline_to_camel) // 列名驼峰命名

		        .idType(IdType.AUTO) // ID 主键生成策略

//                .formatFileName("%sModel") // 格式化文件名称

		        .controllerBuilder() // 配置controller 策略
		        // .superClass(BaseController.class) // 设置父类，没有，不配
		        .enableRestStyle() // RestController
//                .formatFileName("%sController")  // 文件名称

		        // 配置serveice 策略
		        .serviceBuilder() // 配置serveice 策略
				// BaseRepository impl
//                .superServiceClass(BaseRepository.class)
//                .superServiceImplClass(BaseRepositoryImpl.class)
//                .formatServiceFileName("%sRepository")
//                .formatServiceImplFileName("%sRepositoryImpl")

		        // 配置mapper策略
		        .mapperBuilder()
				// 父类
//                .superClass(SuperMapper.class)
		        // 启用mapper注解
		        .enableMapperAnnotation() // 启用mapper注解
		        // 启用 BaseResultMap
		        .enableBaseResultMap().enableBaseColumnList()
//                .formatMapperFileName("%sMapper") // 命名
//                .formatXmlFileName("%sMapper")
		        .build();
		// 执行生成
		new AutoGenerator(dataSourceConfig)
		        // 全局配置
		        .global(globalConfig).packageInfo(packegeConfig).injection(ic).strategy(strategyConfig).template(templateConfig).execute();
		// 默认VelocityTemplateEngine引擎，改为freemark引擎
//                .execute(new FreemarkerTemplateEngine())
		;

	}

}